package ve.com.wayoyo.wuml_case.DibujoDiagramas;

import java.util.ArrayList;

import ve.com.wayoyo.wuml_case.Alert;
import ve.com.wayoyo.wuml_case.ER_TDA;
import ve.com.wayoyo.wuml_case.Painter;
import ve.com.wayoyo.wuml_case.UserPref;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.CompConector._arrowType;
import ve.com.wayoyo.wuml_case.Exceptions.TituloVacioExecption;
import android.R.bool;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Point;

public class DiagramaER extends Diagrama{
	
	private ArrayList<ER_TDA> _TDA_List;

	private CompEntidad _selectedItemFather;
	
	public DiagramaER(){
		super();
		Nombre = "";
		Tipo = "er";
	}	
	
	public void set_components(ArrayList<Componente> componentes){
		this._components = componentes;
	}
	

//	@Override
//	public void AgregarComponente(Componente nuevo) {
//		if(nuevo.ID == 0){
//			nuevo.setID(lastIdGiven + 1);
//			lastIdGiven += 1;
//		}
//		_components.add(nuevo);
//	}
	
	public int getNextId(){
		lastIdGiven += 1;
		return lastIdGiven;
	}

	@Override
	public void Dibujar(Canvas c,int offSetX,int offSetY, float GlobalScale) {
		//Scroll Bars
		if(((VistaDiagrama)VistaDiagrama.getVista()).getMoveFlag() == true){
			dibujarScrollBars(c, offSetX, offSetY, GlobalScale);
		}
		
		//Zoom Helper
		if(((VistaDiagrama)VistaDiagrama.getVista()).isZooming() == true){
			dibujarZoomGuide(c, GlobalScale);
		}
		
		//Muestra la ventana de ayuda
		if(_showHelp){
			dibujarAyuda(c);
		}
		
		//Muestra los tips en el fondo de la pantalla
		if(_showTutorial){
			dibujarTutorial(c);
		}
				
		for (Componente Value : _components) {
			//if(Value.CalcularVisibilidad(offSetX,offSetY,GlobalScale)){
				Value.Dibujar(c, false, GlobalScale,offSetX,offSetY);
			//}
		}
		
		
	}
	
	@Override
	public int checkOnTouch(Point touchPoint,String type) {
		if(_showHelp){
			_showHelp = false;
		}
		CompConector aux = null;
		int respuesta = VistaDiagrama.IDLE;
		if(type.equals("Select")){
			for (Componente Value : _components) {
				if (Value instanceof CompEntidad) {
					Componente compaux = ((CompEntidad)Value).calcularTouchEntidad(touchPoint);
					if(compaux != null){
						respuesta = VistaDiagrama.ITEM_SELECTED;
						resetFocus();
						if (_SelectedConector != null) {
							_SelectedConector.setState(CompConector.IDLE_STATE);
							getComponenteById(_SelectedConector.get_fatherId()).set_currentState(Componente.IDLE);
							getComponenteById(_SelectedConector.get_childId()).set_currentState(Componente.IDLE);
							_SelectedConector = null;
						}
						if (compaux instanceof CompSubEntidad) {
							SelectedItem = compaux;
							_selectedItemFather = (CompEntidad)Value;
							_SelectedConector = null;
							SelectedItem.set_currentState(Componente.SELECTED);
							_selectedItemFather.set_currentState(Componente.INSIDE_PACKAGE);
							break;
						}else{
							SelectedItem = Value;
							SelectedItem.set_currentState(Componente.SELECTED);
							_selectedItemFather = null;
							break;
						}

					}else{
						if(aux == null){
							aux = Value.calcularTouchConectores(touchPoint);
						}
					}
				}else{				
					if(Value.calcularTouch(touchPoint) == true){
						respuesta = VistaDiagrama.ITEM_SELECTED;
						SelectedItem = Value;
						SelectedItem.set_currentState(Componente.SELECTED);
						_SelectedConector = null;
						break;
						
					}else{
						if(aux == null){
							aux = Value.calcularTouchConectores(touchPoint);
						}
					}
				}
			}
			if(aux != null){
				_SelectedConector = aux;
				respuesta = VistaDiagrama.CONNECTOR_SELECTED;
				resetFocus();
				_SelectedConector.setState(CompConector.SELECTED_STATE);
				getComponenteById(_SelectedConector.get_fatherId()).set_currentState(Componente.LINKED);
				getComponenteById(_SelectedConector.get_childId()).set_currentState(Componente.LINKED);
			}
		}
		if(type.equals("Connect")){
			for (Componente Value : _components) {
				if (Value.calcularTouch(touchPoint) == true && (Value.isConnectable())) {
					if((Value.ID != SelectedItem.ID) || Value.isAllowRecursivity()){
						respuesta = VistaDiagrama.ITEM_SELECTED;
						CompConector nuevo; 
						nuevo = new CompConector(SelectedItem.ID, Value.ID);
						Value.actualizarAchorsPoints();
						Value.actualizarPuntoCentral();
						SelectedItem.actualizarAchorsPoints();
						SelectedItem.actualizarPuntoCentral();
						nuevo.CalcularConexiones(SelectedItem, Value);
						SelectedItem._conectorsBegining.add(nuevo);
						nuevo.set_childArrowType(_arrowType.PataDeGallo);
						Value._conectorsEnd.add(nuevo);
						SelectedItem.set_currentState(Componente.SELECTED);
						if(_tutorialStage == 3){
							_showTutorial = false;
							_tutorialStage = 4;
						}
						break;
					}else{
						Alert.show("Este Componente no admite recursividad", (Activity) VistaDiagrama.getVista().getContext(), Alert.ERROR);
					}
				}
			}	
		}
		return respuesta;
	}
	
	@Override
	public void resetFocus() {
		for (Componente Value : _components) {
			Value.removeFocus();	
		}
		SelectedItem = null;
		_selectedItemFather = null;
	}
	
	@Override
	public boolean validarNombre(String nuevo) throws TituloVacioExecption {
		boolean respuesta = true;
		if(nuevo.length() < 1){
			throw new TituloVacioExecption();
		}
		if(UserPref.getInstancia().isUsingConvections() == false){
			for (Componente Value : _components) {
				if(Value.getTitulo().equals(nuevo)){
					respuesta = false;
					break;
				}
			}
		}else{
			String nuevoModf = nuevo.toUpperCase();
			for (Componente Value : _components) {
				if(Value.getTitulo().equals(nuevoModf)){
					respuesta = false;
					break;
				}
			}
		}
		return respuesta;
	}
	
	@Override
	public void moverItemSeleccionado(int distX, int distY) {
		if(_tutorialStage == 2){
			_tutorialStage = 3;
		}
		if(_selectedItemFather != null){
			_selectedItemFather.mover(distX, distY);
			_selectedItemFather.actualizarAchorsPoints();
			_selectedItemFather.actualizarPuntoCentral();
			for (CompSubEntidad subEntidad : ((CompEntidad)_selectedItemFather).get_subEntidades()) {
				subEntidad.mover(distX, distY);
				subEntidad.actualizarAchorsPoints();
				subEntidad.actualizarPuntoCentral();
			}
			SelectedItem.mover(distX, distY);
			SelectedItem.actualizarAchorsPoints();
			SelectedItem.actualizarPuntoCentral();
		}else if(SelectedItem != null){
			SelectedItem.mover(distX, distY);
			SelectedItem.actualizarAchorsPoints();
			SelectedItem.actualizarPuntoCentral();
			if (SelectedItem instanceof CompEntidad) {
				for (CompSubEntidad subEntidad : ((CompEntidad)SelectedItem).get_subEntidades()) {
					subEntidad.mover(distX, distY);
					subEntidad.actualizarAchorsPoints();
					subEntidad.actualizarPuntoCentral();
				}
				
			}
		}
		
	}

	public void addTDA(ER_TDA newTDA) {
		this._TDA_List.add(newTDA);
	}
	
	public ArrayList<ER_TDA> get_TDA_List(){
		return this._TDA_List;
	}
	
	public void agregarAtributo(CompAtributoER comp)
	{		
		if(SelectedItem instanceof CompEntidad)
			((CompEntidad)SelectedItem).addAtributo(comp);
		else if (SelectedItem instanceof CompSubEntidad)
			((CompSubEntidad)SelectedItem).addAtributo(comp);
	}
	
	@Override
	public Componente getComponenteById(int id) {
		for (Componente value : _components) {
			if(value.getID() == id)
				return value;
			for (CompSubEntidad subEntidad : ((CompEntidad)value).get_subEntidades() ) {
				if(subEntidad.getID() == id){
					return subEntidad;
				}
			}
		}
		return null;
	}

	public CompEntidad get_selectedItemFather() {
		return _selectedItemFather;
	}

	public boolean isExportable() {		
		for (Componente value : _components) {
			if (((CompEntidad)value).get_atributos().size()<=0){
				return false;
			}
		}
		return true;
	}
}
